﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Odbc;
using System.Collections;



namespace LI4SilverWCF.data
{
    class DBEstatisticas
    {
        OdbcConnection con;
        public DBEstatisticas(OdbcConnection c)
        {
            con = c;
        }

        public Hashtable obterEstatisticasGerais()
        {
            Hashtable estatisticas = new Hashtable();
            string query = "SELECT NOME_FILME FROM FILME WHERE VISITAS = (SELECT max(VISITAS) FROM FILME)";
            string filme_mais_visto = "";
            OdbcCommand command = new OdbcCommand(query, con);
            con.Open();
            OdbcDataReader reader = command.ExecuteReader();

            try
            {
                while (reader.Read())
                {
                    filme_mais_visto = reader.GetString(0);
                }
            }
            catch (Exception e)
            {
            }
            con.Close();

            estatisticas.Add("Filme Mais Visto", filme_mais_visto);

            query = "SELECT NOME_FILME FROM FILME WHERE (CAST(CLASS_TOT AS DECIMAL(8,2))/CLASSIFICACOES) = (SELECT max(CAST(CLASS_TOT AS DECIMAL(8,2))/CLASSIFICACOES) FROM FILME)";
            string filme_melhor_class = "";
            command = new OdbcCommand(query, con);
            con.Open();
            reader = command.ExecuteReader();
            try
            {
                while (reader.Read())
                {
                    filme_melhor_class = reader.GetString(0);
                }
            }
            catch (Exception e)
            {
            }
            con.Close();

            estatisticas.Add("Filme Melhor Classificado", filme_melhor_class);

            query = "SELECT NOME_GEN FROM GENERO";
            ArrayList generos = new ArrayList();
            string genero_mais_pesquisado = "";
            command = new OdbcCommand(query, con);
            con.Open();
            reader = command.ExecuteReader();
            try
            {
                while (reader.Read())
                {
                    generos.Add(reader.GetString(0));
                }
            }
            catch (Exception e)
            {
            }
            con.Close();

            Hashtable generos_visitas = new Hashtable();
            IEnumerator en = generos.GetEnumerator();
            while (en.MoveNext())
            {
                query = "SELECT SUM(VISITAS) FROM FILME INNER JOIN GENERO ON FILME.COD_GEN = GENERO.COD_GEN WHERE NOME_GEN = '" + en.Current.ToString() + "'";
                command = new OdbcCommand(query, con);
                con.Open();
                reader = command.ExecuteReader();
                try
                {
                    while (reader.Read())
                    {
                        generos_visitas.Add(reader.GetInt32(0), en.Current.ToString());
                    }
                }
                catch (Exception e)
                {
                }
                con.Close();
            }
            ArrayList visitas = new ArrayList(generos_visitas.Keys);

            visitas.Sort();
            genero_mais_pesquisado = (string)generos_visitas[visitas[visitas.Count - 1]];

            estatisticas.Add("Genero Mais Pesquisado", genero_mais_pesquisado);

            query = "SELECT COUNT(COD_CLIENTE) FROM CLIENTE WHERE ESTADO = 'True'";
            int num_clientes_activos = 0;
            command = new OdbcCommand(query, con);
            con.Open();
            reader = command.ExecuteReader();
            try
            {
                while (reader.Read())
                {
                    num_clientes_activos = reader.GetInt32(0);
                }
            }
            catch (Exception e)
            {
            }
            con.Close();

            estatisticas.Add("Numero Clientes Activos", num_clientes_activos);

            query = "SELECT COUNT(COD_CLIENTE) FROM CLIENTE WHERE ESTADO = 'False'";
            int num_clientes_desactivos = 0;
            command = new OdbcCommand(query, con);
            con.Open();
            reader = command.ExecuteReader();
            try
            {
                while (reader.Read())
                {
                    num_clientes_desactivos = reader.GetInt32(0);
                }
            }
            catch (Exception e)
            {
            }
            con.Close();

            estatisticas.Add("Numero Clientes Desactivos", num_clientes_desactivos);

            query = "SELECT COUNT(COD_CLIENTE) FROM LOGFILE WHERE DESCRICAO = 'Autenticacao Efectuada'";
            int logs = 0;
            command = new OdbcCommand(query, con);
            con.Open();
            reader = command.ExecuteReader();
            try
            {
                while (reader.Read())
                {
                    logs = reader.GetInt32(0);
                }
            }
            catch (Exception e)
            {
            }
            con.Close();

            estatisticas.Add("Numero de visitas por clientes (Autenticacoes)", logs);

            return estatisticas;
        }

        public Hashtable obterEstatisticas(String username)
        {
            Hashtable estatisticas = new Hashtable();
            string query = "SELECT NOME_FILME FROM FILME WHERE VISITAS = (SELECT max(VISITAS) FROM FILME)";
            string filme_mais_visto = "";
            OdbcCommand command = new OdbcCommand(query, con);
            con.Open();
            OdbcDataReader reader = command.ExecuteReader();

            try
            {
                while (reader.Read())
                {
                    filme_mais_visto = reader.GetString(0);
                }
            }
            catch (Exception e)
            {
            }
            con.Close();

            estatisticas.Add("Filme Mais Visto", filme_mais_visto);

            query = "SELECT NOME_FILME FROM FILME WHERE (CAST(CLASS_TOT AS DECIMAL(8,2))/CLASSIFICACOES) = (SELECT max(CAST(CLASS_TOT AS DECIMAL(8,2))/CLASSIFICACOES) FROM FILME)";
            string filme_melhor_class = "";
            command = new OdbcCommand(query, con);
            con.Open();
            reader = command.ExecuteReader();
            try
            {
                while (reader.Read())
                {
                    filme_melhor_class = reader.GetString(0);
                }
            }
            catch (Exception e)
            {
            }
            con.Close();

            estatisticas.Add("Filme Melhor Classificado", filme_melhor_class);

            query = "SELECT NOME_GEN FROM GENERO";
            ArrayList generos = new ArrayList();
            string genero_mais_pesquisado = "";
            command = new OdbcCommand(query, con);
            con.Open();
            reader = command.ExecuteReader();
            try
            {
                while (reader.Read())
                {
                    generos.Add(reader.GetString(0));
                }
            }
            catch (Exception e)
            {
            }
            con.Close();

            Hashtable generos_visitas = new Hashtable();
            IEnumerator en = generos.GetEnumerator();
            while (en.MoveNext())
            {
                query = "SELECT SUM(VISITAS) FROM FILME INNER JOIN GENERO ON FILME.COD_GEN = GENERO.COD_GEN WHERE NOME_GEN = '" + en.Current.ToString() + "'";
                command = new OdbcCommand(query, con);
                con.Open();
                reader = command.ExecuteReader();
                try
                {
                    while (reader.Read())
                    {
                        generos_visitas.Add(reader.GetInt32(0), en.Current.ToString());
                    }
                }
                catch (Exception e)
                {
                }
                con.Close();
            }
            ArrayList visitas = new ArrayList(generos_visitas.Keys);

            visitas.Sort();
            genero_mais_pesquisado = (string)generos_visitas[visitas[visitas.Count - 1]];

            estatisticas.Add("Genero Mais Pesquisado", genero_mais_pesquisado);

            query = "SELECT COUNT(USERNAME) FROM CLIENTE INNER JOIN LOGFILE ON CLIENTE.COD_CLIENTE = LOGFILE.COD_CLIENTE WHERE DESCRICAO = 'Autenticacao Efectuada' AND USERNAME = '" + username + "'";
            command = new OdbcCommand(query, con);
            con.Open();
            reader = command.ExecuteReader();
            int logs = 0;

            try
            {
                while (reader.Read())
                {
                    logs = reader.GetInt32(0);
                }
            }
            catch (Exception e)
            {
            }
            con.Close();

            estatisticas.Add("Numero de visitas", logs);

            query = "SELECT COUNT(USERNAME) FROM VOTO_CLIENTE_FILME INNER JOIN CLIENTE ON VOTO_CLIENTE_FILME.COD_CLIENTE = CLIENTE.COD_CLIENTE WHERE USERNAME = '" + username + "'";
            command = new OdbcCommand(query, con);
            con.Open();
            reader = command.ExecuteReader();
            int votos = 0;

            try
            {
                while (reader.Read())
                {
                    votos = reader.GetInt32(0);
                }
            }
            catch (Exception e)
            {
            }
            con.Close();

            estatisticas.Add("Numero de filmes classificados", votos);

            query = "SELECT COUNT(USERNAME) FROM CLIENTE_PREMIO INNER JOIN CLIENTE ON CLIENTE_PREMIO.COD_CLIENTE = CLIENTE.COD_CLIENTE WHERE USERNAME = '" + username + "'";
            command = new OdbcCommand(query, con);
            con.Open();
            reader = command.ExecuteReader();
            int premios = 0;

            try
            {
                while (reader.Read())
                {
                    premios = reader.GetInt32(0);
                }
            }
            catch (Exception e)
            {
            }
            con.Close();

            estatisticas.Add("Numero de premios adquiridos", premios);

            return estatisticas;
        }

    }
}